export interface IHilink<T = Function> {
  /**
   * 从本地查询设备状态
   * @param devId 表示设备的服务ID ，取值详见Device Partner平台的Profile中的定义。
   * @param json_body
   * @param resultCallback
   */
  getDevCacheAll(devId: "0", json_body: string, cb: T): void;
  /**
   * 从云侧查询设备状态
   * @param devId
   * @param sid 表示设备的服务ID ，取值详见Device Partner平台的Profile中的定义。
   * @param json_body
   * @param resultCallback
   */
  getDevInfo(devId: "0", sid: string, json_body: string, cb: T): void;
  /**
   * 从云侧查询设备状态（支持LUA脚本）
   * @param devId 
   * @param sid 表示设备的服务ID ，取值详见Device Partner平台的Profile中的定义。
   * @param json_body 
   * 如果需要查询该sid下的所有属性值，json_body取值为空即可。
   * 如果需要查询该sid下的部分属性值，json_body取值应包含所需查询的characteristicName的取值。例如：
   * JSON.stringify(["version","introduction"])。
   * @param resultCallback 
   *  function resultCallback(resultStr){
        var result = resultStr; // 请求的返回结果
      }
   * hilink.getDevInfoWithProdId("0", sid, cid, "resultCallback");
   */
  getDevInfoWithProdId(devId: "0", sid: string, json_body: string, cb: T): void;
  /**
   * 下发命令到设备（带单个sid）
   * @param devId
   * @param json_body JSON.stringify({sid1: {on: 1, action: 1}}); json_body不能为空，否则将导致失败
   * @param resultCallback
   */
  setDeviceInfo(devId: "0", json_body: string, cb: T): void;
  /**
   * 下发命令到设备（带多个sid）
   * @param devId
   * @param json_body json_body不能为空，否则将导致失败
   * var json_body = JSON.stringify({
   *   sid1: {on1: 1, action1: 1},
   * );
   * @param isParallel true：并行下发 false：串行下发
   * @param isWaitAll true：当所有命令下发成功，才会回调返回结果 false：只要有一个命令下发成功，就会回调返回结果
   * @param resultCallback
   */
  setMultipleDeviceInfo(devId: string, json_body: string, isParallel: string, isWaitAll: string, cb: T): void;

  /**
   * 下发命令到设备（支持LUA脚本）
   * @param devId
   * @param json_body json_body不能为空，否则将导致失败
   * var json_body = JSON.stringify({
   *   sid1: {on1: 1, action1: 1},
   * );
   * @param resultCallback
   */
  setDeviceInfoWithProdId(devId: string, json_body: string, cb: T): void;

  /**
   * 下发命令到设备（长按控制）
   * @param devId
   * @param json_body json_body不能为空，否则将导致失败
   * var json_body = JSON.stringify({
   *   sid1: {on1: 1, action1: 1},
   * );
   * @param resultCallback
   * @param isLongPressInProgress true：长按命令开始执行 false：长按命令结束
   */
  setLongPressDeviceInfo(devId: string, json_body: string, cb: T, isLongPressInProgress: boolean): void;
  /**
   * 下发命令到设备（循环控制）
   * @param devId
   * @param serivceId 服务ID
   * @param json_body json_body不能为空，否则将导致失败
   * var json_body = JSON.stringify({
   *   sid1: {on1: 1, action1: 1},
   * );
   * @param loopFlag 是否重复循环。 "1"：是。 "0" ：否。
   * @param intervalTime 间隔时间，单位为ms
   * @param resultCallback
   */
  setDeviceServiceLoop(
    devId: string,
    serivceId: string,
    json_body: string,
    loopFlag: string,
    intervalTime: string,
    cb: T
  ): void;

  /**
   * 下发命令到设备（无回调控制）
   * @param devId
   * @param json_body json_body不能为空，否则将导致失败
   * var json_body = JSON.stringify({
   *   sid1: {on1: 1, action1: 1},
   * );
   */
  setDeviceInfoWithoutCallback(devId: "0", json_body: string): void;

  /**
   * 查询设备历史记录
   * @param devId
   * @param pageNo 返回的页码数，缺省为0
   * @param pageSize 每页的数据个数，缺省为10
   * @param startTime 历史记录开始的UTC（世界标准时间）时间 yyyyMMddTHHmmssZ
   * @param endTime 历史记录结束的UTC（世界标准时间）时间 yyyyMMddTHHmmssZ
   * @param sid 设备的service id Profile
   * @param character 设备的characteristicName Profile
   * @param cb JS回调。
   */
  getDevHistory(
    devId: string,
    pageNo: number | string,
    pageSize: number | string,
    startTime: string,
    endTime: string,
    sid: string,
    character: string,
    cb: T
  ): void;

  /**
   * 删除设备历史记录
   * @param devId
   * @param serviceId 设备的service id
   * @param cursor 查询的游标，缺省时为null
   * @param json_body
   */
  deleteDeviceHistory(devId: "0", serviceId: string, cursor: string | null, json_body: string): void;

  /**
   * 设备一键注册 - android
   * @param json_body
   * @param resultCallback
   */
  registerInfraredHubDevice(json_body: string, cb: T): void;

  /**
   * 设备一键注册 - ios
   * @param json_body
   * @param resultCallback
   */
  regiterInfraredHubDevice(json_body: string, cb: T): void;

  /**
   * 设备一键注销
   * @param devId
   * @param resultCallback
   */
  deleteInfraredHubDevice(devId: "0", cb: T): void;

  /**
   * 上报扩展数据
   * @param json_body
   * @param resultCallback
   */
  postDeviceExtendData(json_body: string, cb: T): void;
  /**
   * 上报扩展数据（带devId）
   * @param devId
   * @param resultCallback
   */
  postDeviceExtendDataById(devId: string, cb: T): void;
  /**
   * 查询扩展数据
   * @param type
   * @param resultCallback
   */
  getDeviceExtendData(type: string, cb: T): void;
  /**
   *
   * @param json_body
   * @param resultCallback
   */
  getDeviceExtendDataById(json_body: string, cb: T): void;
  /**
   * 删除扩展数据
   * @param type
   * @param resultCallback
   */
  deleteDeviceExtendData(type: string, cb: T): void;

  /**
   * 删除扩展数据（带devId）
   * @param devId
   * @param type
   * @param resultCallback
   */
  deleteDeviceExtendDataById(devId: string, type: string, cb: T): void;

  /**
   * 上报设备状态数据
   * @param devId
   * @param json_body
   * @param resultCallback
   */
  reportDeviceProfileImpermanency(devId: "0", json_body: string, cb: T): void;

  /**
   * 删除当前设备
   * @param isAssociate
   * @param resultCallback
   */
  deleteDevice(isAssociate: string, cb: T): void;

  /**
   * 修改设备名称
   * @param deviceName
   * @param resultCallback
   */
  modifyDeviceName(deviceName: string, cb: T): void;

  /**
   * 修改设备所处房间
   * @param chooseRoomString
   * @param resultCallback
   */
  modifyDeviceRoomName(chooseRoomString: string, cb: T): void;

  /**
   * 从本地查询设备静态信息
   * @param resultCallback
   */
  getDeviceInfo(cb: T): void;

  /**
   * 上传设备文件
   * @param file
   * @param additionInfo
   * @param callback
   */
  uploadObjectReq(file: string, additionInfo: string, cb: T): void;

  /**
   * 查询设备文件
   * @param request
   * @param callback
   */
  downloadObjectReq(request: string, cb: T): void;

  /**
   * 删除设备文件
   * @param request
   * @param callback
   */
  deleteObjectReq(request: string, cb: T): void;

  /**
   * 查询用户列表
   * @param devId
   * @param callback
   */
  getUserList(devId: string, cb: T): void;

  /**
   * 添加用户信息
   * @param userInfo
   * @param callback
   */
  setUserList(userInfo: string, cb: T): void;

  /**
   * 更新用户信息
   * @param userInfo
   * @param callback
   */
  updateUserList(userInfo: string, cb: T): void;

  /**
   * 查询设备状态上报的统计数据
   * @param devId
   * @param request
   * @param callback
   */
  getDevStatisticsDataWithQuery(devId: string, request: string, cb: T): void;

  /**
   * 查询设备状态上报统计数据（标量）
   * @param devId
   * @param serviceId
   * @param characteristicName
   * @param callback
   */
  getDevScalarData(devId: string, serviceId: string, characteristicName: string, cb: T): void;

  /**
   * 查询设备的Profile信息
   * @param callback
   */
  getDeviceProfile(cb: T): void;

  /**
   * 查询网桥子设备列表
   * @param callback
   */
  getBridgeSubclassRegisteredDevices(cb: T): void;

  /**
   * 查询设备的H5 URL地址
   * @param productId
   * @param callback
   */
  getSubDeviceUrl(productId: string, cb: T): void;

  /**
   * 查询设备与路由的连接关系
   * @param deviceId
   * @param callback
   */
  getHilinkConnection(deviceId: string, cb: T): void;

  /**
   * 从云端查询设备快照
   * @param deviceId
   * @param extendData
   * @param callback
   */
  getDevInfoAll(deviceId: string, extendData: string, cb: T): void;

  /**
   * 查询房间列表信息
   * @param callback
   */
  getRoomList(cb: T): void;

  /**
   * 查询规则（根据过滤条件）
   * @param condition
   * @param callback
   */
  getRules(condition: string, cb: T): void;

  /**
   * 查询规则（根据ruleID）
   * @param ruleId
   * @param callback
   */
  getSingleRule(ruleId: string, cb: T): void;

  /**
   * 创建规则
   * @param rule
   * @param callback
   */
  createRule(rule: string, cb: T): void;

  /**
   * 修改规则
   * @param rule
   * @param callback
   */
  updateRule(rule: string, cb: T): void;

  /**
   * 删除多个规则
   */
  deleteRules(ruleIds: string, cb: T): void;

  /**
   * 删除单个规则
   * @param ruleId
   * @param callback
   */
  deleteSingleRule(ruleId: string, cb: T): void;

  /**
   * 控制单个规则的激活状态
   * @param ruleId
   * @param active
   * @param resultCallback
   */
  controlRuleActive(ruleId: string, active: string, cb: T): void;

  /**
   * 查询规则执行日志
   * @param cursor
   * @param pageSize
   * @param startTime
   * @param endTime
   * @param resultCallback
   */
  getDeviceRuleEvents(cursor: string, pageSize: string, startTime: string, endTime: string, cb: T): void;

  /**
   * 查询设备为触发条件的智能场景数量
   * @param resultCallback
   */
  getAutoRuleSize(cb: T): void;

  /**
   * 跳转至华为商城产品页面
   * @param suffix
   */
  gotoVmall(suffix: string): void;

  /**
   * 跳转至Native页面
   * @param typeString
   * @param callback
   */
  gotoNative(typeString: string, cb: T): void;

  jumpTo(uri: string, cb: T): void;
  /**
   * 跳转至定时器页面
   * @param uri
   * @param resultCallback
   */
  jumpTo(uri: "com.huawei.smarthome.timerPage", cb: T): void;

  /**
   * 拉起倒计时弹窗
   */
  showDelayInfoDialog(): void;

  /**
   * 跳转至设备信息页面
   * @param uri
   * @param resultCallback
   */
  jumpTo(uri: "com.huawei.smarthome.deviceinfoactivity", cb: T): void;

  /**
   * 跳转至设备网络信息页面
   * @param uri
   * @param resultCallback
   */
  jumpTo(uri: "com.huawei.smarthome.deviceNetinfoActivity", cb: T): void;

  /**
   * 跳转至门锁匹配页面
   * @param uri
   * @param resultCallback
   */
  jumpTo(uri: "com.huawei.smarthome.addSmartlockActivity", cb: T): void;

  /**
   * 跳转至设备设置页面
   * @param uri
   * @param resultCallback
   */
  jumpTo(uri: "com.huawei.smarthome.deviceSettingActivity", cb: T): void;

  /**
   * 跳转设备离线页面
   * @param deviceId
   * @param hotline
   * @param resultCallback
   */
  jumpToOfflineHelpActivity(deviceId: string, hotline: string, cb: T): void;

  /**
   * 跳转到设备离线帮助页面（自定义离线帮助信息）
   * @param deviceId
   * @param message
   * @param resultCallback
   */
  jumpToSelfOfflineHelpActivity(deviceId: string, message: string, cb: T): void;

  /**
   * 跳转至其他App
   * @param packageName
   * @param resultCallback
   */
  startApp(packageName: string, cb: T): void;

  /**
   * 网桥跳转到子设备页面
   * @param listCount
   * @param resultCallback
   */
  jumpToH5Device(listCount: number, cb: T): void;

  /**
   * 调整标题栏
   * @param uri true，标题栏及状态栏文字白色，false标题栏及状态栏文字黑色
   * @param argb ARGB背景色值，目前已无作用
   * @param resultCallback
   */
  modifyTitleBar(uri: boolean, argb: string, cb: T): void;

  /**
   * 设置标题栏能否点击
   * @param uri
   * @param resultCallback
   */
  setTitleEnable(uri: boolean, cb: T): void;

  /**
   * 设置标题栏是否可见
   * @param uri
   * @param resultCallback
   */
  setTitleVisible(uri: boolean, cb: T): void;

  /**
   * 添加覆盖提示
   * @param json_body 
   * JSON.stringify
   * {
      "type": 24 // 自定义int值
      "key": 1  // 目前请均传值1
      "icon": 1 // 覆盖消息前图标的编号，可以为Null，可传值为数组对应角标，参考下图
      "color": 0 // 字体颜色编号，可以为null，可传值为数组对应角标，可传值见下图
      "msg": "ssssss" // 需要显示的信息
   * }
   * @param resultCallback 
   */
  addMessage(json_body: string, cb: T): void;

  /**
   * 移除覆盖提示
   * @param json_body
   * @param resultCallback
   */
  removeMessage(json_body: string, cb: T): void;

  /**
   * 设置提示信息是否可见
   * @param uri
   * @param resultCallback
   */
  setMessageVisible(uri: boolean, cb: T): void;

  /**
   * 修改标题样式
   * @param styleValue 标题样式值，当前仅支持2（即Emui 10.0风格）
   */
  changeTitleStyle(styleValue: number): void;

  /**
   * 显示标题栏中的图标
   * @param json_body
   * @param buttonClick
   * @param isVisible
   * @param resultCallback
   */
  showTitleBarIcons(json_body: string, buttonClick: string, isVisible: boolean, cb: T): void;

  /**
   * 查询手机状态栏高度
   * @param resultCallback
   */
  getStatusBarHeight(cb: T): void;

  /**
   * 调用原生弹框样式
   * @param time 提示显示时长
   * @param body 提示内容
   */
  toast(time: number | string, body: string): void;

  /**
   * 判断平板横竖屏状态
   * @return -1:非平板 0:平板横屏 1:平板竖屏
   */
  getPadLandscape(): number | undefined;

  /**
   * 退出设备页面
   */
  finishDeviceActivity(): void;

  /**
   * 打印debug级别的日志信息
   * @param isSaveLog true，保存日志信息，false不保存日志信息
   * @param tag 日志信息的关键字
   * @param msg 需要打印的内容或信息
   */
  printLogDebug(isSaveLog: boolean, tag: string, msg: string): void;

  /**
   * 打印用户级别的日志信息
   * @param isSaveLog true，保存日志信息，false不保存日志信息
   * @param tag 日志信息的关键字
   * @param msg 需要打印的内容或信息
   */
  printLog(isSaveLog: boolean, tag: string, msg: string): void;

  /**
   * 启用重写安卓物理返回键
   * @param enable
   * @param resultCallback
   */
  overrideBackPressed(enable: boolean, cb: T): void;

  /**
   * 重新设置标题栏右上角的设置按钮点击事件
   * @param enable
   * @param resultCallback
   */
  overrideSettingClick(enable: boolean, cb: T): void;

  /**
   * 请求三方服务器
   * @param json_body
   * @param resultCallback
   */
  requestThirdPartConfig(json_body: string, cb: T): void;

  /**
   * 向数据库中存储/查询键值对
   * @param json_body
   * @param resultCallback
   */
  setH5Info(key: string, value: string, cb: T): void;

  /**
   * 向数据库中存储/查询/删除键值对
   * @param key
   * @param value
   * @param resultCallback
   */
  setStorageSync(key: string, value: string, cb: T): void;

  /**
   * 查询系统版本
   * @param resultCallback
   */
  getVersion(cb: T): void;

  /**
   * H5界面刷新
   */
  refreshWebView(): void;

  /**
   * 登录验证接口
   * @param resultCallback
   */
  verifyPassword(cb: T): void;

  /**
   * 查询App版本号
   * @param resultCallback
   */
  getAppVersionCode(cb: T): void;

  /**
   * 查询当前用户家庭角色
   * @param resultCallback
   */
  getUserRole(cb: T): void;

  /**
   * BI打点接口
   * @param biKey
   * @param biH5Info
   */
  reportH5SingleDevBiInfo(biKey: string, biH5Info: string): void;

  /**
   * 调用系统摄像头拍照/从相册查询图片
   * @param fileName
   * @param resultCallback
   */
  takePhoto(fileName: string, cb: T): void;

  /**
   * 查询App语言
   */
  getAppLanguageSync(): string | undefined;

  /**
   * 查询当前模式
   * @param resultCallback
   * @return 1:正常模式 2:dark模式
   */
  getDarkMode(cb?: T): void;

  /**
   * 是否启用native的语音功能引导页
   * @param enabled
   * @param resultCallback
   */
  setGuideDialogEnable(enabled: boolean, cb: T): void;

  /**
   * 判断（折叠屏手机）屏幕是否展开
   */
  isScreenSpreaded(): boolean | undefined;

  /**
   * 创建快捷方式 IOS
   * @param deviceId
   * @param productId
   * @param deviceName
   * @param resultCallback
   */
  createShortCut(deviceId: string, productId: string, deviceName: string, cb: T): void;
  /**
   * 创建快捷方式 android
   * @param deviceId
   * @param productId
   * @param deviceName
   * @param resultCallback
   */
  createShortCut(deviceId: string, productId: string, deviceName: string): void;

  /**
   * 请求三方服务器（支持自定义header）
   * @param jsonBody
   * @param resultCallback
   */
  doHttpsRequest(jsonBody: string, cb: T): void;

  /**
   * 共享设备 什么操作不清楚 文档里没有
   * @param cb
   */
  refuseSharedDevice(cb: T): void;
}
